package liumeiya.rbac.service;

import liumeiya.rbac.domain.dto.DeptDto;
import liumeiya.rbac.domain.entity.Dept;
import liumeiya.rbac.domain.vo.DeptVo;
import liumeiya.rbac.domain.vo.Result;

import java.util.Arrays;

public class DeptService {

    /**
     * 实体对象存储量
     */
    public static int DATA_SIZE = 100;

    /**
     * 实体对象存储数组
     */
    public static Dept[] data = new Dept[DATA_SIZE + 1];

    /**
     * ID 计数器
     */
    public static int idCounter = 1;


    /**
     * 创建新的 部门并将其储存到数据数组中。
     * <p>
     * 本方法接收偶一个 ‘DeptDto’ 对象作为输入， 使用其中的部门名称和电话创建一个新的部门对象
     * 如果当前储存的部门数量没有超过最大容量限制，方法将为新部门分配一个ID， 并将其存储在数据数组中。
     * 如果存储容量已满，则返回创建失败的结果。
     * </p>
     *
     * @param dto 包含新部门信息的 'DeptDto'对象
     * @return 返回一个包含操作结果的 'Result' 对象， 表示创建是否成功
     */
    public static Result create(DeptDto dto) {
        //检查当前存储的部门数量是否超过最大容量
        if (idCounter > DATA_SIZE) {
            //如果超过最大容量， 返回失败结果
            return Result.failure("创建失败，超出存储容量");
        }

//        //创建新的部门对象， 使用传入的部门名称和电话
//        Dept dept = new Dept(dto.name, dto.phone);
//
//        //为新创建的部门分配一个唯一的ID
//        dept.id = idCounter++;
        Dept dept = createEntity(dto, idCounter++);

        // 将新部门对象存储到数据数组中
        data[dept.id] = dept;

        //返回成功结果
        return Result.success("创建成功", null);
    }

    public static DeptVo convertToVo(Dept dept) {
        return new DeptVo(dept.id, dept.name, dept.phone);
    }

    public static Dept createEntity(DeptDto dto, int id) {
        Dept dept = new Dept(dto.name, dto.phone);
        dept.id = id;
        return dept;
    }

    public static void updateEntity(DeptDto dto, Dept dept) {
        dept.name = dto.name;
        dept.phone = dto.phone;
    }

    public static boolean existById(int id) {
        return id < 1 || id >= idCounter || data[id] == null;
    }

    public static Result list() {
        DeptVo[] temp = new DeptVo[DATA_SIZE];

        int length = 0;

        for (int i = 1; i < idCounter; i++) {
            if (data[i] != null) {
                temp[length++] = convertToVo(data[i]);
            }
        }

        return Result.success("查询成功", Arrays.copyOf(temp, length));
    }

    /**
     * 更新指定部门的信息。
     * <p>
     * 本方法通过传入的部门 ID 和部门数据传输对象 ('DeptDto') 更新对应部门的名称和电话。如果指定的ID 无效（例如，
     * ID 小于1、 ID超出有效范围， 或者该ID 对应的数据为 'null'), 则返回更新失败的结果。
     * </p>
     *
     * @param dto 包含要更新的部门名称和电话的 'DeptDto' 对象
     * @param id  需要更新的部门的 ID
     * @return 返回一个 'Return' 对象， 表示更新操作是否成功
     */
    public static Result update(DeptDto dto, int id) {
        if (existById(id)) {
            return Result.failure("更新失败，不存在该数据");
        }

//        Dept dept = data[id];

//        dept.name = dto.name;
//        dept.phone = dto.phone;
        updateEntity(dto, data[id]);

        return Result.success("更新成功", null);
    }



    /**
     * 删除指定 ID 的部门。
     * <p>
     * 本方法通过传入的部门 ID 删除对应的部门数据。 如果指定的 ID 无效（例如， ID小于1、 ID 超出有效范围
     * 或者该ID 对应的数据为 'null')，则返回删除失败的结果。
     * </p>
     *
     * @param id 需要删除的部门的ID
     * @return 返回一个 'Result' 对象， 表示删除操作是否成功
     */
    public static Result delete(int id) {
        // 检查提供的部门 ID 是否有效： ID 小于 1， ID 超出有效范围， 或者该ID 对应的数据为空
        if (existById(id)) {
            // 如果ID 无效， 返回删除失败的结果
            return Result.failure("删除失败，不存在该数据");
        }

        // 检查是否有⽤户属于该部⻔，如果有则不准删除，返回失败的结果
        if (UserService.deptInUse(id)) {
            return Result.failure("删除失败，有⽤户属于该部⻔，不能删除");
        }

        // 将指定 ID 的部门数据置为 null， 表示删除该数据
        data[id] = null;

        // 返回删除成功的结果
        return Result.success("删除成功", null);

    }

    /**
     * 根据 ID 查找部门信息
     *
     * @param id 部门 ID
     * @return 部门实体对象，如果未找到则返回 null
     */
    public static Dept findById(int id) {
        //调用 existById 方法检查该 ID 对应的部门是否存在
        if (!existById(id)) {
            //如果存在，返回该 ID 对应的部门实体对象
            return data[id];
        }
        // 如果不存在，返回 null
        return null;
    }
}

